# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score, roc_curve, roc_auc_score, confusion_matrix, classification_report
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
import seaborn as sns
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体显示中文
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 1. 数据加载与初步探索
# 读取Excel文件
df = pd.read_excel('C:/Users/Administrator/Desktop/信用卡精准营销模型.xlsx')

# 显示前5行数据，了解数据结构
print("数据前5行：")
print(df.head())

# 查看数据基本信息
print("\n数据基本信息：")
print(df.info())

# 查看数据统计描述
print("\n数据统计描述：")
print(df.describe())

# 2. 数据预处理
# 检查缺失值
print("\n缺失值统计：")
print(df.isnull().sum())

# 处理缺失值 - 使用中位数填充数值型变量
numerical_cols = df.select_dtypes(include=['int64', 'float64']).columns
imputer = SimpleImputer(strategy='median')
df[numerical_cols] = imputer.fit_transform(df[numerical_cols])

# 检查重复值
print("\n重复值数量：", df.duplicated().sum())

# 删除重复值
df = df.drop_duplicates()

# 3. 数据分析与可视化
# 响应变量分布
plt.figure(figsize=(6, 4))
sns.countplot(x='响应', data=df)
plt.title('响应变量分布')
plt.show()

# 数值型变量分布
numerical_features = df.select_dtypes(include=['int64', 'float64']).columns
df[numerical_features].hist(bins=20, figsize=(15, 10))
plt.suptitle('数值型变量分布')
plt.show()

# 相关性分析
plt.figure(figsize=(12, 8))
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('变量相关性热力图')
plt.show()

# 4. 特征工程与数据准备
# 分离特征和目标变量
X = df.drop(columns='响应')
y = df['响应']

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=123, stratify=y)

# 5. 模型构建与训练
# 初始化AdaBoost分类器
clf = AdaBoostClassifier(random_state=123)

# 训练模型
clf.fit(X_train, y_train)

# 6. 模型评估
# 预测测试集
y_pred = clf.predict(X_test)
y_pred_proba = clf.predict_proba(X_test)[:, 1]

# 准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"\n模型准确率: {accuracy:.4f}")

# ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label=f'AdaBoost (AUC = {roc_auc_score(y_test, y_pred_proba):.2f})')
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC曲线')
plt.legend()
plt.show()

# AUC分数
auc_score = roc_auc_score(y_test, y_pred_proba)
print(f"AUC分数: {auc_score:.4f}")

# 混淆矩阵
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6, 4))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('混淆矩阵')
plt.xlabel('预测值')
plt.ylabel('实际值')
plt.show()

# 分类报告
print("\n分类报告：")
print(classification_report(y_test, y_pred))

# 7. 特征重要性分析
features = X.columns
importances = clf.feature_importances_

# 创建特征重要性DataFrame
importances_df = pd.DataFrame({
    '特征名称': features,
    '特征重要性': importances
}).sort_values('特征重要性', ascending=False)

# 可视化特征重要性
plt.figure(figsize=(10, 6))
sns.barplot(x='特征重要性', y='特征名称', data=importances_df)
plt.title('特征重要性排序')
plt.show()

# 输出最重要的10个特征
print("\n最重要的10个特征：")
print(importances_df.head(10))